package br.com.virtual.recomendar.dao.impl;

import java.util.List;

import javax.persistence.NoResultException;

import br.com.virtual.base.dao.impl.BaseDaoImpl;
import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.cadastrar.model.Produto;
import br.com.virtual.recomendar.dao.AvaliacaoDAO;
import br.com.virtual.recomendar.model.Avaliacao;

public class AvaliacaoDAOImpl extends BaseDaoImpl implements AvaliacaoDAO {

	@Override
	public Avaliacao create(Avaliacao avaliacao) {
		
		getManager().persist(avaliacao);
		return avaliacao;
	}

	@Override
	public Avaliacao read(Long id) {
		return getManager().find(Avaliacao.class, id);
	}

	@Override
	public Avaliacao update(Avaliacao avaliacao) {
		return getManager().merge(avaliacao);
	}

	@Override
	public void delete(Avaliacao avaliacao) {
		getManager().remove(avaliacao);
	}

	@Override
	public List<Avaliacao> list() {
		
		return getManager().createQuery("select a from Avaliacao a", Avaliacao.class).getResultList();
	}

	@Override
	public List<Avaliacao> listByPessoa(Pessoa pessoa) {
		
		return getManager().createQuery(
				"select a from Avaliacao a where a.pessoa = :pessoa ", Avaliacao.class)
				.setParameter("pessoa", pessoa)
				.getResultList();
	}

	@Override
	public List<Avaliacao> listByProduto(Produto produto) {
		
		return getManager().createQuery(
				"select a from Avaliacao a where a.produto = :produto ", Avaliacao.class)
				.setParameter("produto", produto)
				.getResultList();
	}

	@Override
	public Avaliacao getAvaliacao(Produto produtoAvaliado, Pessoa avaliador) {
		
		Avaliacao avaliacao;
		try {
			
			avaliacao = (Avaliacao) getManager().createQuery(
							"select a from Avaliacao a where a.produto = :produto and a.pessoa = :pessoa")
							.setParameter("pessoa", avaliador)
							.setParameter("produto", produtoAvaliado)
							.getSingleResult();
		} catch (NoResultException e) {
			avaliacao = null;
		}
		
		return avaliacao;
	}

	@Override
	public boolean hasAvaliacao(Pessoa pessoa) {
		
		Long somaAvaliacao = getManager()
				.createQuery(" select count(a) from Avaliacao a where a.pessoa = :pessoa", Long.class)
				.setParameter("pessoa", pessoa)
				.getSingleResult();
		
		
		return somaAvaliacao != 0;
	}

}
